
package hit.edu.zjc.UserInterface;

import java.io.Serializable;
import java.util.Calendar;

public abstract class UserDef implements Serializable {
	
	public static final int IntegerType =1;//整数型
	public static final int StringType  =2;//字符型
	public static final int DateType    =3;//日期型
	public static final int DoubleType  =4;//浮点型
	public static int Colnum=0;
	private static final long serialVersionUID = 1L;
	public static final int EASYFILL=100;
	public static final double Simalarity=0.9;
	
	public boolean isCheck=false;//true:需要对该行进行检测  false:不需要对该行进行检测
	public int Type=2;//默认类型
	public boolean isNull=false;//是否允许空
	public boolean isEasyFill=true;//是否简单填充,某个特定值,为false，就需要采用缺失值填充方法。
	public int FillType=100;
	public int[] RelevantColumID=null;//isEasyFill=false, 数组中记录相关列的ID号。
	public UserDef(int t,boolean ic,boolean in,boolean ie)
	{
		Type=t;
		isCheck=ic;
		isNull=in;
		isEasyFill=ie;
	}
	public abstract boolean checkdata(String ob);//检测异常值的处理
	public abstract String correctdata();//简单的异常值处理，如果isEasyFill是false，返回null
	public abstract String complexFill(String[] data);
	//public abstract Object voidaction();//值缺失的处理
	
	protected static UserDef[] ud_array=null;
	/*
	 * 负责考虑是否初始化
	 * 添加对新加两列的描述，ischeck=false。
	 * */
	public static UserDef[] GetUserDef()
	{
		if(ud_array==null)
		{
			Init();
			//增加新增的第一列和最后一列的描述。
			UserDef[] old_array=ud_array;
			ud_array=new UserDef[old_array.length+2];
			ud_array[0]=new UDIntegerType(true,false,0,false,0,false,0,UDIntegerType.MINFILL);//新列，数据新主键。最小值作为新主键
			ud_array[ud_array.length-1]=new UDStringType(true,false,".*","",UDStringType.MostFrequent);//新列，数据来源。
			for(int i=0;i<old_array.length;i++)
				ud_array[i+1]=old_array[i];
		}
		return ud_array;
	}
	/*
	 * 对ud_array进行初始化，长度为数据表的列数。
	 * 因为在对数据读取时，在增加了新的第一列和最后一列
	 * 所以在调用完此函数后，还需要在原数组的基础上增加对第一列和最后一列的描述。
	 * 切记，切记。
	 * */
	protected static void Init()
	{
		//对ud_array,colnum的赋值。
		//测试代码，样例取自photo_inf表。
		//注意调用用完Calendar.getInstance()，后需要调用clear()
		Calendar early=Calendar.getInstance();
		early.clear();
		early.set(2012,0,1);
		Calendar late=Calendar.getInstance();
		late.clear();
		late.set(2012,11,30);
		Calendar correct=Calendar.getInstance();
		correct.clear();
		correct.set(2012,11,12);
		
		Colnum=13;
		ud_array=new UserDef[13];
		ud_array[0]=new UDIntegerType(true,false,0,false,1,true,0);//id_photo,int
		ud_array[1]=new UDStringType(true,false,".*","not named",UDStringType.MostFrequent);//name_photo,str
		ud_array[2]=new UDStringType(true,false,".*","张佳程",UDStringType.MostFrequent);//author,str

		ud_array[3]=new UDDateType(true,late,true,early,UDDateType.MOSTFREQUENTDATE,new int[]{2,3});//shoot_time,date
		ud_array[4]=new UDStringType(true,false,".*","Harbin Institute of Technology.",UDStringType.MostFrequent);//shoot_location,str
		ud_array[5]=new UDIntegerType(true,false,0,false,1,true,0);//id_album,int
		ud_array[6]=new UDDateType(true,false,true,late,true,early,correct,UDDateType.LATESTDATE);//create_time,date
		ud_array[7]=new UDDateType(true,false,true,late,true,early,correct,UDDateType.LATESTDATE);//update_time,date
		ud_array[8]=new UDIntegerType(true,false,0,false,1,true,0);//no_view,int
		ud_array[9]=new UDStringType(true,false,".*","nothing",UDStringType.MostFrequent);//keywords,str
		ud_array[10]=new UDStringType(true,false,".*","nothing",UDStringType.MostFrequent);//description,str
		ud_array[11]=new UDIntegerType(true,false,1,true,0,true,1,UDIntegerType.MINFILL);//limit,int
		ud_array[12]=new UDStringType(true,false,".*","jpg",UDStringType.MostFrequent);//ext,str
	}

}
